package fr.upmc.cie.data;

import java.util.ArrayList;

import android.content.Context;

import fr.upmc.cie.data.exception.CategorieNameDuplicateException;
import fr.upmc.cie.data.exception.CategorieNotExistException;
import fr.upmc.cie.data.interfaces.ICategorieDataSource;
import fr.upmc.cie.ext.Utils;

public class CategorieManager {
	
	private ICategorieDataSource dataSource;
	
	protected CategorieManager(ICategorieDataSource dataSource){
		this.dataSource = dataSource;
	}

	/**
	 * Rnvoie tous les categories
	 * @return
	 */
	public ArrayList<CategorieItem> getAllCategories(){
		return dataSource.getAllCategories();
	}
	
	/**
	 * Renvoie le nom de tous les categories
	 * @return
	 */
	public ArrayList<String> getAllCategoriesName(){
		ArrayList<String> names = new ArrayList<String>();
		for (CategorieItem ci :  dataSource.getAllCategories()){
			names.add(ci.getName());
		}
		return names;
	}
	
	/**
	 * Inserer une categorie
	 * @param ci
	 * @param context
	 * @return
	 */
	public boolean insertCategorie(CategorieItem ci,Context context){
		try {
			this.dataSource.insert(ci);
			return true;
		} catch (CategorieNameDuplicateException e) {
			Utils.getAlertBox(context, "Category name already exist. Please select another alias.");
			return false;
		}
	}
	
	/**
	 * Supprimer une categorie
	 * @param ci
	 * @param context
	 * @return
	 */
	public boolean deleteCategorie(CategorieItem ci, Context context){
		try {
			this.dataSource.delete(ci);
			return true;
		} catch (CategorieNotExistException e) {
			Utils.getAlertBox(context, "Category doesn't exist.");
			return false;
		}
	}
	
	/**
	 * Mettre a jour une categorie
	 * @param ci
	 * @param context
	 * @return
	 */
	public boolean updateCategorie(CategorieItem ci, Context context){
		try {
			this.dataSource.update(ci);
			return true;
		} catch (CategorieNotExistException e) {
			Utils.getAlertBox(context, "Category doesn't exist.");
			return false;
		} catch (CategorieNameDuplicateException e) {
			Utils.getAlertBox(context, "Category name already exist. Please select another alias.");
			return false;
		}
	}
	
	/**
	 * Obtenir une categorie a partir de son nom
	 * @param name
	 * @param context
	 * @return
	 */
	public CategorieItem getCategorieByName(String name, Context context){
		try {
			return this.dataSource.getCategorieByName(name);
		} catch (CategorieNotExistException e) {
			Utils.getAlertBox(context, "Category doesn't exist.");
			return null;
		}
	}
	
	/**
	 * Obtenir une categorie a partir de son id
	 * @param id
	 * @param context
	 * @return
	 */
	public CategorieItem getCategorieById(Long id, Context context){
		try {
			return this.dataSource.getCategorieById(id);
		} catch (CategorieNotExistException e) {
			Utils.getAlertBox(context, "Category doesn't exist.");
			return null;
		}
	}
	


	
}
